package com.hison.tandainbao.util;


import com.hison.tandainbao.entiy.pojo.domain.User;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.util.Date;

/**
 * @ClassName: JWTUtils
 * @Descripiton: JWT工具类  登录校验封装通用方法
 * 注意点：
 * 1.生成的token可以通过base64进行解密出明文信息
 * 2.base64进行解密出明文信息，修改再进行编码，则会解密失败
 * 3.无法作废已颁布的token 除非改秘钥
 * @Author: 小郑
 * @Date： 2023/4/23 8:36
 * @Version：1.8
 **/
public class JWTUtils {

    /**
     * 根据用户信息，生成令牌
     *
     * @param user
     * @return
     */
    public static String geneJsonWebToken(User user) {
        String token = Jwts.builder().setSubject(SystemFianl.SUBJECT)  //设置主题
                //头像
                .claim("head_img", user.getUserIcon())
                //id
                .claim("id", user.getId())
                //姓名
                .claim("name", user.getName())
                //昵称
                .claim("nickName",user.getNickName())
                .setIssuedAt(new Date())  //颁发时间
                .setExpiration(new Date(System.currentTimeMillis() + SystemFianl.EXPIRE)) //过期时间   底层自动判断
                .signWith(SignatureAlgorithm.HS256, SystemFianl.SECRET).compact();
        token = SystemFianl.TOKEN_PREFIX + token;  //拼接前缀
        return token;
    }


    /**
     * 校验token的方法  （解密）
     *
     * @param token 令牌
     * @return {@link Claims}
     */
    public static Claims checkJWT(String token) {
        try {
            Claims claims = Jwts.parser().setSigningKey(SystemFianl.SECRET)
                    .parseClaimsJws(token.replace(SystemFianl.TOKEN_PREFIX, ""))//将前缀替换
                    .getBody();
            return claims;
        } catch (Exception e) {
            //校验失败    密码错误，session过期等
            return null;
        }
    }
}